// 定义常量
const HOST = 'localhost'
const PORT = '6163'
const POINT_STYLE = {
  Angle: 0, // 角度
  Color: 541, // 子图的颜色号
  Space: 0,
  SymHeight: 5, // 点的高度
  SymID: 31, // 子图号
  SymWidth: 5, // 点的宽度
}

/**
 * 定义一个构造函数, 模拟Point类
 * @param {object} options :
 *                    - style: 点的样式
 *                    - fields: 字段列表 {字段名: 字段类型} eg.{name:'string'}
 *                    - layerID: 图层编号, 从0开始
 */
function Point(options) {
  // 在构造函数中, 完成属性的定义
  this.style = options.style || POINT_STYLE
  this.fName = Object.keys(options.fields) || []
  this.fLength = options.fields.length || 0
  this.fType = Object.values(options.fields) || []

  Point.doc = options.doc // 静态属性
  this.service = options.doc.name
  this.layerID = options.layerID
  this.host = options.doc.ip || HOST
  this.port = options.doc.port || PORT
}

// 在原型对象上, 完成方法的定义
Point.prototype.add = function (point, attr, callback) {
  if (!Array.isArray(point)) {
    throw new TypeError('第一个参数必须是一个数组, 长度为2')
  }

  if (!Array.isArray(attr)) {
    throw new TypeError('第二个参数必须是一个数组')
  }

  // 2.1 构建几何信息
  //创建一个点形状，描述点形状的几何信息
  var gpoint = new Zondy.Object.GPoint(point[0], point[1]) //createPoint();
  //设置当前点要素的几何信息
  var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] })
  // 2.2 设置样式信息
  //描述点要素的符号参数信息
  var pointInfo = new Zondy.Object.CPointInfo(this.style)
  //设置当前点要素的图形参数信息
  var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
    InfoType: 1, // 点
    PntInfo: pointInfo,
  })
  // 2.3 设置属性信息
  //设置添加点要素的属性信息
  var attValue = attr
  // 2.4 构建要素对象
  //创建一个要素
  var feature = new Zondy.Object.Feature({
    fGeom: fGeom,
    GraphicInfo: webGraphicInfo,
    AttValue: attValue,
  })
  //设置要素为点要素
  feature.setFType(1)
  // 2.5 设置要素集
  //创建一个要素数据集
  var featureSet = new Zondy.Object.FeatureSet()
  //设置属性结构
  var cAttStruct = new Zondy.Object.CAttStruct({
    FldName: this.fName, // 属性的字段名
    FldNumber: this.fLength, // 属性的个数
    FldType: this.fType, // 属性的类型
  })
  featureSet.AttStruct = cAttStruct
  //添加要素到要素数据集
  featureSet.addFeature(feature)

  // 2.6 调用编辑服务接口
  //创建一个编辑服务类
  // 第一个参数: 服务的名称
  // 第二个参数: 图层的编号
  var editService = new Zondy.Service.EditDocFeature(
    this.service,
    this.layerID,
    {
      ip: this.host,
      port: this.port, //访问IGServer的端口号，.net版为6163，Java版为8089
    }
  )

  if (callback) {
    editService.add(featureSet, callback)
  } else {
    editService.add(featureSet, this.onSuccess)
  }
}

Point.prototype.onSuccess = function (data) {
  if (data.succeed) {
    alert('添加成功!')
    Point.doc.refresh() // 重新加载地图文档
  } else {
    alert('添加失败!')
  }
}

/*
const city = new Point({
  doc: docLayer,
  service: 'doc_20211227',
  layerID: '2',
  fields: {
    // 字段名: 字段类型
    name: 'string',
    length: 'float',
  },
})

city.add([114, 30], ['武汉'])
*/
